package day12;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class DeleteEmptyFolders {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除包含.strm后缀文件的子目录所在的根目录路径(仅测试Windows系统)：");
        String rootDirPath = scanner.nextLine();

        // 创建一个线程池，包含4个线程
        ExecutorService executorService = Executors.newFixedThreadPool(4);

        // 开始查找并处理符合条件的子目录
        findAndProcessTargetFolders(rootDirPath, executorService);

        // 关闭线程池，等待所有任务完成
        executorService.shutdown();
        while (!executorService.isTerminated()) {
            // 可以在这里添加一些等待逻辑，比如输出提示信息等，表明正在等待任务完成
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println("所有符合条件的子目录删除完成");
        scanner.close();
    }

    // 查找并处理给定目录及其子目录下的所有符合条件的子目录（包含.strm后缀文件的子目录）
    private static void findAndProcessTargetFolders(String dirPath, ExecutorService executorService) {
        File dir = new File(dirPath);
        File[] files = dir.listFiles();
        if (files == null) {
            return;
        }

        List<File> subDirsWithStrm = new ArrayList<>();
        for (File file : files) {
            if (file.isDirectory() && hasStrmFile(file)) {
                subDirsWithStrm.add(file);
            }
        }

        if (subDirsWithStrm.isEmpty()) {
            // 没有符合条件的子目录，直接检查当前目录是否可以删除（无子目录含.strm文件）
            if (!hasStrmFile(dir)) {
                deleteFolder(dirPath);
            }
        } else {
            // 有符合条件的子目录，提交子目录的处理任务到线程池
            for (File subDir : subDirsWithStrm) {
                executorService.execute(() -> {
                    findAndProcessTargetFolders(subDir.getAbsolutePath(), executorService);
                });
            }
        }
    }

    // 判断给定目录及其子目录下是否存在.strm后缀文件
    private static boolean hasStrmFile(File dir) {
        File[] files = dir.listFiles();
        if (files == null) {
            return false;
        }
        for (File file : files) {
            if (file.isFile() && file.getName().endsWith(".strm")) {
                return true;
            } else if (file.isDirectory()) {
                if (hasStrmFile(file)) {
                    return true;
                }
            }
        }
        return false;
    }

    // 获取给定文件列表中的子目录列表
    private static List<File> getSubDirs(File[] files) {
        ArrayList<File> subDirs = new ArrayList<>();
        for (File file : files) {
            if (file.isDirectory()) {
                subDirs.add (file);
            }
        }
        return subDirs;
    }

    // 删除指定路径的文件夹
    private static void deleteFolder(String folderPath) {
        File folder = new File(folderPath);
        if (folder.exists()) {
            if (folder.delete()) {
                System.out.println("已成功删除符合条件的子目录: " + folderPath);
            } else {
                System.out.println("删除符合条件的子目录失败: " + folderPath);
            }
        }
    }
}